package gepes.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import gepes.exepcion.Excepcion;
import gepes.modelo.Usuario;
import gepes.util.ConexionBD;

public class UsuarioDAO extends BaseDAO {
	public int login(Usuario vo) throws Excepcion {
		String query = "SELECT count(0) "
				+ "WHERE U.MAIL =? AND U.PASSWORD = MD5(?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.ConectarDB();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getMail());
			stmt.setString(2, vo.getPassword());
			rs = stmt.executeQuery();
			if (rs.next()) {
				return 1;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new Excepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return 0;
	}


public Usuario insertar(Usuario u) throws Excepcion {
	String query = "insert into usuario(codtipousuario,apepat,apemat,nombres,sexo,codtipodocumento,nrodocumento) "
			+ " values(?,?,?,?,?,?,?)";
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.ConectarDB();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, u.getTipoUsuario().getCodTipoUsuario());
		stmt.setString(2, u.getApePat());
		stmt.setString(3, u.getApeMat());
		stmt.setString(4, u.getNombres());
		stmt.setString(5, u.getSexo());
		stmt.setInt(6,u.getTipoDocumento().getCodTipoDocumento());
		stmt.setString(7, u.getNroDocumento());
		
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("Error insertar");
		}

		int id = 0;
		query = "select last_insert_id()";
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		if (rs.next()) {
			id = rs.getInt(1);
		}
		u.setCodUsuario(id);
		
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new Excepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return u;
}

public Usuario actualizar(Usuario vo) throws Excepcion {
	String query = "update usuario set nombres=?, codtipousuario=? where codusuario=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.ConectarDB();
		stmt = con.prepareStatement(query);
		stmt.setString(1, vo.getNombres());
		stmt.setInt(2, vo.getTipoUsuario().getCodTipoUsuario());
		stmt.setInt(3, vo.getCodUsuario());
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo actualizar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new Excepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public Usuario obtener(int codusuario) throws Excepcion {
	Usuario vo = new Usuario();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		String query = "select codusuario, nombres from usuario where codusuario=?";
		con = ConexionBD.ConectarDB();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, codusuario);
		rs = stmt.executeQuery();
		if (rs.next()) {
			vo.setCodUsuario(rs.getInt(1));
			vo.setNombres(rs.getString(2));
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new Excepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return vo;
}

public void eliminar(int codusuario) throws Excepcion {
	String query = "delete from usuario WHERE codusuario=?";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.ConectarDB();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, codusuario);
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo eliminar");
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new Excepcion(e.getMessage());
	} finally {
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
}


public Collection<Usuario> buscarPorNombres(String nombres)
		throws Excepcion {
	String query = "select * from usuario where nombres like ?";		
	
	Collection<Usuario> lista = new ArrayList<Usuario>();
	
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.ConectarDB();
		stmt = con.prepareStatement(query);
		stmt.setString(1, "%" + nombres + "%");
		
		rs = stmt.executeQuery();
		while (rs.next()) {
			;
			Usuario vo = new Usuario();
			vo.setApePat(rs.getString("apepat"));
			vo.setApeMat(rs.getString("apemat"));
			vo.setNombres(rs.getString("nombres"));
			//vo.setIdUsuario(rs.getString("Id_Usuario"));
			//vo.setNombres(rs.getString("nombres"));
			//vo.setPaterno(rs.getString("paterno"));
			lista.add(vo);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new Excepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	System.out.println(lista.size());
	return lista;
}



}